home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 June / CHIP Haziran 2001.iso / prog / haziran / 19 / setup.exe / data.z / usb_diag.cpp < prev    next >
C/C++ Source or Header  |  2001-04-11  |  7KB  |  283 lines

  1. //    usb_diag.cpp - diagnostic sample for testing usb devices
  2. //
  3.  
  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "../../include/windrvr.h"
  8. #include "../shared/usb_diag_lib.h"
  9.  
  10. class UsbDiagSession
  11. {
  12. private:
  13.     char line[256];
  14.     WD_USB_DEVICE_REGISTER *m_pDev;
  15.     int GetPipeType(DWORD dwPipe);
  16. public:
  17.     HANDLE m_hWD;
  18.     UsbDiagSession();
  19.     int MainMenu();
  20.     virtual ~UsbDiagSession();
  21.     void DoReadWrite();
  22.     void DoResetPipe();
  23.     void DoCloseDevice(); 
  24.     void DoOpenDevice();
  25.     void DoDisplayPipesInfo();
  26.     void DoResetDevice();
  27.     BOOL Init();
  28.     void CloseWindriver();
  29. };
  30.  
  31. int UsbDiagSession::GetPipeType(DWORD dwPipe)
  32. {
  33.     if(!m_pDev || !m_pDev->hDevice)
  34.         return -1;
  35.  
  36.     for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
  37.     {
  38.         WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
  39.         if (pPipe->dwNumber==dwPipe && pPipe->type>=0 && pPipe->type<3)
  40.             return pPipe->type;
  41.     }
  42.     return -1;
  43. }
  44.  
  45. UsbDiagSession::UsbDiagSession()
  46. {
  47.     m_hWD = INVALID_HANDLE_VALUE;
  48.     m_pDev = NULL;
  49. }
  50.  
  51. UsbDiagSession::~UsbDiagSession() 
  52. {
  53.     DoCloseDevice();
  54.     CloseWindriver();
  55. };
  56.  
  57. void UsbDiagSession::DoResetDevice()
  58. {
  59.     if(!m_pDev || !m_pDev->hDevice)
  60.         return;
  61.     WD_UsbResetDevice(m_hWD, m_pDev->hDevice);
  62. }    
  63.  
  64. void UsbDiagSession::DoCloseDevice()
  65. {
  66.     if(!m_pDev || !m_pDev->hDevice)
  67.         return;
  68.     WD_UsbDeviceUnregister(m_hWD, m_pDev);
  69.     free (m_pDev);
  70.     m_pDev = NULL;
  71.     printf("Device closed successfully\n");
  72. }
  73.  
  74. void UsbDiagSession::CloseWindriver()
  75. {
  76.     if(m_hWD == INVALID_HANDLE_VALUE)
  77.         return;
  78.     WD_Close(m_hWD);
  79.     m_hWD = INVALID_HANDLE_VALUE;
  80. }
  81.  
  82. BOOL UsbDiagSession::Init()
  83. {
  84.     m_hWD = WD_Open();
  85.     return (m_hWD != INVALID_HANDLE_VALUE);
  86. }    
  87.  
  88. void UsbDiagSession::DoOpenDevice()
  89. {
  90.     if(m_pDev && m_pDev->hDevice)
  91.     {
  92.         printf("Device already open ! \n");
  93.         return;
  94.     }
  95.     
  96.     if (!m_pDev)
  97.         m_pDev = (WD_USB_DEVICE_REGISTER *) malloc(sizeof(WD_USB_DEVICE_REGISTER));
  98.  
  99.     BZERO(*m_pDev);
  100.  
  101.     printf ("Please enter physical address, configuration and interface data:\n");
  102.     printf ("------------------------------------\n");
  103.     printf ("Enter unique ID of the device: ");
  104.     fgets(line, sizeof(line), stdin);
  105.     sscanf(line, "%d",&m_pDev->uniqueId);
  106.     printf ("Enter configuration index: ");
  107.     fgets(line, sizeof(line), stdin);
  108.     sscanf(line, "%d",&m_pDev->dwConfigurationIndex);
  109.     printf ("Enter interface number: ");
  110.     fgets(line, sizeof(line), stdin);
  111.     sscanf(line, "%d",&m_pDev->dwInterfaceNum);
  112.     printf ("Enter alternate setting of the interface : ");
  113.     fgets(line, sizeof(line), stdin);
  114.     sscanf(line, "%d",&m_pDev->dwInterfaceAlternate);
  115.  
  116.  
  117.     WD_UsbDeviceRegister(m_hWD, m_pDev);
  118.     if (!m_pDev->hDevice)
  119.     {
  120.         printf("Failed registring the device\n");
  121.         free (m_pDev);
  122.         m_pDev = NULL;
  123.         return;
  124.     }
  125.     DoDisplayPipesInfo();
  126. }
  127.  
  128. void UsbDiagSession::DoDisplayPipesInfo()
  129. {
  130.     printf("device has %d pipes:\n", m_pDev->Device.dwPipes);
  131.     for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
  132.     {
  133.         WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
  134.         PCHAR pipeType[] ={"Control", "Isochronous", "Bulk", "Interrupt"};
  135.         if (pPipe->type>3)
  136.             printf("recived wrong pipe type (0x%x)\n", pPipe->type);
  137.         printf("pipe no. %02x - type: %s\n", pPipe->dwNumber, pipeType[pPipe->type]);
  138.         printf("    max packet size: %d,  direction: %s,  interval: %d\n",
  139.             pPipe->dwMaximumPacketSize, 
  140.             pPipe->direction==USB_DIR_IN ? "In" : pPipe->direction==USB_DIR_OUT ? "Out" : "In & Out",
  141.             pPipe->dwInterval);
  142.     }
  143. }
  144.  
  145. void UsbDiagSession::DoReadWrite()
  146. {
  147.     WD_USB_TRANSFER transfer;
  148.     BZERO(transfer);
  149.     BOOL fStatus = 0;
  150.     
  151.     if(!m_pDev || !m_pDev->hDevice)
  152.         return;
  153.  
  154.     transfer.hDevice = m_pDev->hDevice;
  155.     printf("Enter pipe number:");
  156.     fgets(line, sizeof(line), stdin);
  157.     sscanf(line, "%x",&transfer.dwPipe);
  158.     printf("Enter direction of data (0-OUT , 1-IN): ");
  159.     fgets(line, sizeof(line), stdin);
  160.     sscanf(line, "%d",&transfer.fRead);
  161.     if (GetPipeType(transfer.dwPipe)==0) // control pipe
  162.     {
  163.         printf("Enter setup packet (8 bytes)\n");
  164.         GetHexBuffer((PVOID)transfer.SetupPacket, 8);
  165.         transfer.dwBytes = transfer.SetupPacket[6] + (transfer.SetupPacket[7]<<8);
  166.     }
  167.     else
  168.     {
  169.         printf("Enter buffer size to %s:" , transfer.fRead ? "read" : "write");
  170.         fgets(line, sizeof(line), stdin);
  171.         sscanf(line, "%d", &transfer.dwBytes);
  172.     }
  173.  
  174.     transfer.pBuffer = malloc (transfer.dwBytes);
  175.     if(!transfer.pBuffer)
  176.     {
  177.         printf("Failed to allocate buffer\n");
  178.         return;
  179.     }
  180.  
  181.     printf("Enter wait time in kernel in milli-seconds (0 for infinite):");
  182.     fgets(line, sizeof(line), stdin);
  183.     sscanf(line, "%d", &transfer.dwTimeout);
  184.     if(!transfer.fRead)
  185.     {
  186.         printf("Enter data :");
  187.         GetHexBuffer(transfer.pBuffer, transfer.dwBytes);
  188.     }
  189.  
  190.     WD_UsbTransfer(m_hWD, &transfer);
  191.     if (transfer.fOK)
  192.         printf("transfer successful\n");
  193.     else
  194.         printf("error on transfer\n");
  195.     if(transfer.fRead && transfer.dwBytesTransfered)
  196.         PrintHexBuffer(transfer.pBuffer, transfer.dwBytesTransfered);    
  197.     printf("Bytes transferred = %d\n", transfer.dwBytesTransfered);
  198.     free(transfer.pBuffer);
  199.     return;
  200. }
  201.  
  202. void UsbDiagSession::DoResetPipe()
  203. {
  204.     WD_USB_RESET_PIPE resetPipe; 
  205.     BZERO(resetPipe);
  206.     if(!m_pDev || !m_pDev->hDevice)
  207.         return;
  208.     resetPipe.hDevice = m_pDev->hDevice;
  209.     printf("Enter pipe number:");
  210.     fgets(line, sizeof(line), stdin);
  211.     sscanf(line, "%d",&resetPipe.dwPipe);
  212.     WD_UsbResetPipe(m_hWD, &resetPipe);
  213. }
  214.  
  215. int UsbDiagSession::MainMenu()
  216. {
  217.     int cmd = 0;
  218.     char line[100];
  219.     printf("\n");
  220.     printf("--------- " WD_PROD_NAME " USB Diagnostic ------------ \n");
  221.     printf("--------- Main Menu ---------\n");
  222.     printf("(1) - Scan for USB Devices\n");
  223.     printf("(2) - Get device configurations\n");
  224.     if (!m_pDev || !m_pDev->hDevice)
  225.         printf("(3) - Open device \n");
  226.     else
  227.     {
  228.         printf("(4) - Display pipes info\n");
  229.         printf("(5) - Reset USB Device and Port\n");
  230.         printf("(6) - Reset Pipe \n");
  231.         printf("(7) - Read\\write from pipe\n");
  232.         printf("(8) - Close USB Device\n");
  233.     }
  234.     printf("(99) - Exit\n");
  235.  
  236.     fgets(line, sizeof(line), stdin);
  237.     sscanf(line, "%d",&cmd);
  238.  
  239.     return cmd;
  240. }
  241.  
  242. int _cdecl main(int argc, char *argv[])
  243. {
  244.     UsbDiagSession session;
  245.  
  246.     if(!session.Init())
  247.         return 0;
  248.  
  249.     while (1)
  250.     {
  251.         switch (session.MainMenu())
  252.         {
  253.         case 1:
  254.             USB_Print_all_devices_info();
  255.             break;
  256.         case 2:
  257.             USB_Print_device_Configurations();
  258.             break;
  259.         case 3:
  260.             session.DoOpenDevice();
  261.             break;
  262.         case 4:
  263.             session.DoDisplayPipesInfo();
  264.             break;
  265.         case 5:
  266.             session.DoResetDevice();
  267.             break;
  268.         case 6:
  269.             session.DoResetPipe();
  270.             break;
  271.         case 7:
  272.             session.DoReadWrite();
  273.             break;
  274.         case 8:
  275.             session.DoCloseDevice();
  276.             break;
  277.         case 99:
  278.             return 0;
  279.         }
  280.     }
  281.     return 0;
  282. }
  283.